package ip4util

import "net"

// MaskStr2Int 字符串格式的掩码转整数。 输入 "255.255.0.0" 返回 16
// 错误的掩码返回 0
func MaskStr2Int(maskStr string) int {
	ip4 := net.ParseIP(maskStr).To4()
	ones, _ := net.IPMask(ip4).Size()
	return ones
}

// MaskInt2Str 整数格式的掩码转字符串。 输入 16 返回 "255.255.0.0"
// 错误的掩码返回 "0.0.0.0"
func MaskInt2Str(maskInt int) string {
	if maskInt > 32 {
		return "0.0.0.0"
	}
	mask := 0xffffffff >> (32 - maskInt) << (32 - maskInt)
	return Int2IP(mask).String()
}

// GetNumOfHostsFromMask 返回主机数量，已减去了一个广播地址和一个网络地址
// 错误的掩码返回 -1
func GetNumOfHostsFromMask(maskInt int) int {
	switch {
	case maskInt > 32 || maskInt < 0:
		return -1
	case maskInt == 32:
		return 1
	default:
		mask := 0xffffffff >> (32 - maskInt) << (32 - maskInt)
		return 0xffffffff - mask - 1
	}
}
